20180412 Wikipedia 爬蟲練習

###導入模組
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import random 

###給定初始的wiki連結(base_url),以及一個有初始關鍵字連結的list(his) 
base_url = "https://zh.wikipedia.org"
his = ["/wiki/%E5%8F%B0%E7%81%A3%E7%A9%8D%E9%AB%94%E9%9B%BB%E8%B7%AF%E8%A3%BD%E9%80%A0"]

###初始關鍵的wiki包進BS裡面
url = base_url + his[-1] #his[-1]為list中的最後(新)一項
html = urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html, features='lxml')

###打印出title以及其對應的連結
print(soup.find('h1',{'id':'firstHeading'}).get_text(), '    url: ', base_url+str(his[-1]))

[同場加映] 從初始關鍵字裡面的連結開始循環式的爬蟲 (例子為50次)

###做50次循環,同前例方式抓出title及對應連結
for i in range(50):
    url = base_url + his[-1]
    html = urlopen(url).read().decode('utf-8')
    soup = BeautifulSoup(html, features='lxml')
    print(soup.find('h1',{'id':'firstHeading'}).get_text(), '    url: ', base_url+str(his[-1]))

    ### 用BS模組找到有效的連結 
    ### 正則表達的解釋
        # (?=^/wiki) -> 表示開頭必須符合/Wiki
        # (%.{2}) -> ()表示將其括弧內的內容組合在一起看;  %.{2}表示%+任何符號重複兩次
        # +$ -> +表示匹配前面括號內字符無限次;  $表示匹配字串的末尾
    sub_urls = soup.find_all("a", { "href": re.compile("(?=^/wiki)/wiki/(%.{2})+$")})

    ### 如頁面裡無連結或重複,則跳回前一(最新)連結
    ### 找到的所有連結將其隨機取得sub_url的第一項
        if sub_urls== his[-1]:
        his.pop(-1)
    elif len(sub_urls) != 0:
        his.append(random.sample(sub_urls, 1)[0]['href'])
    else:    
        his.pop(-1)

results matching ""

    No results matching ""